﻿package mymyoux.graphics.controls
{

	import mx.collections.ArrayCollection;
	import mx.collections.Sort;
	import mx.collections.SortField;
	import mx.containers.VBox;
	import mx.controls.List;
	
	import mymyoux.io.mserveur.events.MRoomEvent;
	import mymyoux.io.mserveur.MRoom;
	import mymyoux.io.mserveur.mcontactClasses.People;
	import mymyoux.io.mserveur.mcontactClasses.events.MRoomContactsEvent;
	/**
	 * Affiche la liste des personnes connectés dans un salon (MRoom)
	 */
	public class ContactsList extends VBox
	{
		/**
		 * Liste de Contacts.
		 */
		protected var _list:List;
		/**
		 * @private
		 */
		protected var _room:MRoom;
		/**
		 * Crée une liste de contact pour un salon.
		 * @param room Salon pour lequel on affiche les contacts.
		 */
		public function ContactsList(room:MRoom)
		{
			_list=new List();
			addChild(_list);
			_list.percentHeight=100;
			_list.percentWidth=100;
			_list.dataProvider=new ArrayCollection();
			_list.labelField="login";
			this.room=room;
		}
		/**
		 * Salon pour lequel on affiche les contacts.
		 */
		public function get room():MRoom
		{
			return _room;
		}
		public function set room(value:MRoom):void
		{
			if(_room!=null)
			{
				_room.removeEventListener(MRoomContactsEvent.PEOPLE_IN,onPeopleIn);
				_room.removeEventListener(MRoomContactsEvent.PEOPLE_OUT,onPeopleOut);
				_room.removeEventListener(MRoomEvent.DISCONNECT,onDisconnect);
			}
			(_list.dataProvider as ArrayCollection).removeAll();
			_room=value;
			var contacts:Array=_room.contacts.getContacts();
			var i:int=0;
			for(;i<contacts.length;i++)
			{
				addPeople(contacts[i]);
			}
			_room.addEventListener(MRoomContactsEvent.PEOPLE_IN,onPeopleIn);
			_room.addEventListener(MRoomContactsEvent.PEOPLE_OUT,onPeopleOut);
			_room.addEventListener(MRoomEvent.DISCONNECT,onDisconnect);
		}
		/**
		 * Rajoute une personne dans la liste de contact.
		 * Seulement si elle n'y est pas déjà et classe la liste par ordre alphabétique.
		 * @param people Personne à rajouter.
		 */
		protected function addPeople(people:People):void
		{
			if(!(_list.dataProvider as ArrayCollection).contains(people))
			{
				(_list.dataProvider as ArrayCollection).addItem(people);
				 var sort:Sort = new Sort();
			     // There is only one sort field, so use a null first parameter.
			     sort.fields = [new SortField(null, true)];
			    (_list.dataProvider as ArrayCollection).sort = sort;
			       (_list.dataProvider as ArrayCollection).refresh();
  
			}
		}
		/**
		 * Appelée lorsqu'une personne se connecte.
		 * Appel addPeople ensuite
		 * @param event Evenement dispatché par MRoomContactsEvent
		 * @see #addPeople()
		 */
		protected function onPeopleIn(event:MRoomContactsEvent):void
		{
			addPeople(event.people);
		}
		/**
		 * Appelée lorsqu'une personne se déconnecte.
		 * @param event Evenement dispatché par MRoomContactsEvent
		 */
		protected function onPeopleOut(event:MRoomContactsEvent):void
		{
			if((_list.dataProvider as ArrayCollection).contains(event.people))
			{
				var index:int=(_list.dataProvider as ArrayCollection).getItemIndex(event.people);
				(_list.dataProvider as ArrayCollection).removeItemAt(index);
			}
		}
		/**
		 * Appelée lorsque le salon est déconnecté
		 * Efface toute la liste
		 * @param event Evenement dispatché par MRoomEvent
		 */
		protected function onDisconnect(event:MRoomEvent):void
		{
			(_list.dataProvider as ArrayCollection).removeAll();
		}

	}
}